#include "Vector.h"

Vector::Vector(int tamano) {
    _nodoVector.tamano = tamano;
    //_nodoVector.posicion = new int[tamano];
    _nodoVector.posicion = (int*) mallocParametro(sizeof(int) * tamano);

    this->_punteroADato = &_nodoVector;
}

Vector::Vector(string valor){

}

Vector::Vector(void* punteroADato){
    this->_punteroADato = punteroADato;
}

Vector::~Vector(){
    freeParametro(_nodoVector.posicion);
    //delete[]((int*)_nodoVector.posicion);
}

void* Vector::damePunteroAMemoria() {
    return this->_nodoVector.posicion;
}

void Vector::comparar(TipoDeDato& tipoDeDato,ostream& out) {
    NodoVector* otroValor = (NodoVector*) tipoDeDato.damePunteroADato();

    int otroTamano = (*otroValor).tamano;
    int* otroPosicion = (*otroValor).posicion;
    int esteTamano = _nodoVector.tamano;
    int* estePosicion = _nodoVector.posicion;

    int hasta = min(otroTamano, esteTamano);

    for( int i = 0; i < hasta; i++ ){
        if ( estePosicion[i] != otroPosicion[i] ) {
            out << "Diferencia en la posicion " << i << " del vector. Valor esperado: " << estePosicion[i] << " . Valor obtenido: " << otroPosicion[i] << endl;
        }
    }

    int diferencia = abs(esteTamano - otroTamano);

    if ( diferencia != 0 ) {
        if (esteTamano > otroTamano) {
            out << "Existe una diferencia de cantidad de nodos. La salida esperada tiene mas nodos que la obtenida. Detalle:" << endl;
            for ( int i = otroTamano; i < esteTamano; i++ ) {
                out << "Posicion " << i << " vale: " << estePosicion[i] << endl;
            }
        } else {
            out << "Existe una diferencia de cantidad de nodos. La salida obtenida tiene mas nodos que la esperada. Detalle:" << endl;
            for ( int i = esteTamano; i < otroTamano; i++ ) {
                out << "Posicion " << i << " vale: " << otroPosicion[i] << endl;
            }
        }
    }

}

int& Vector::operator[](int i){
    return _nodoVector.posicion[i];
}

ClaseDeDato Vector::getClass() {
    return C_VECTOR;
}
